package jers;

import java.io.Serializable;

import jers.util.Configurator;
import jers.util.Daemon;
import jers.util.FileServer;
import jers.util.Logger;
import jers.util.ThreadPool;


/**
 * Interface reponsavel por criar as instancias dos objetos do sistema.
 * <p>
 * Os objetos sao construidos por metodos com o nome de suas interfaces
 * e suas implementacoes podem ser definidas no arquivo de configuracoes.
 * </p>
 * 
 * @see {@link Manager}, {@link Service}. {@link Result},
 * 		{@link Job}, {@link Provider}, {@link FileServer}, 
 * 		{@link ThreadPool}, {@link Logger}, {@link Configurator}
 * 
 * @author 
 * 		<a href="mailto:felipe.zappala@gmail.com">
 * 			Luis Felipe Zappala
 * 		</a> [ <a href="http://lncc.br/ist">ISTCC-P</a> / 2009 ]
 */
public interface Factory {

	/**
	 * Retorna uma instancia do objeto {@link Result}.
	 * 
	 * @return 
	 * 		A instancia do resultado.
	 */
	public abstract Result newResult();

	/**
	 * Retorna uma instancia do objeto {@link Service}.
	 * 
	 * @return 
	 * 		A instancia do servico.
	 */
	public abstract Service newService();

	/**
	 * Retorna uma instancia do objeto {@link Callback}.
	 * 
	 * @param 
	 * 		callback - A instancia de {@link Callback} a ser decorada. 
	 * @return 
	 * 		A instancia da callback.
	 */
	public abstract Callback newCallback(Callback callback);
	
	/**
	 * Retorna uma instancia do objeto {@link Callback}.
	 * 
	 * @param 
	 * 		callback - A instancia de {@link Runnable} a ser decorada. 
	 * @return 
	 * 		A instancia da callback.
	 */
	public abstract Callback newCallback(Runnable callback);
	
	/**
	 * Retorna uma instancia do objeto {@link Job}.
	 * 
	 * @param 
	 * 		Job - Um objeto que implementa as interfaces 
	 * 		{@link Runnable} e {@link Serializable}.   
	 * @return 
	 * 		A instancia do trabalho.
	 */
	public abstract Job newJob(Runnable job);

	/**
	 * Retorna uma instancia do objeto {@link Provider}.
	 * 
	 * @return
	 * 		A instancia do provedor de servicos.
	 */
	public abstract Provider newProvider();

	/**
	 * Retorna uma instancia do objeto {@link Manager}.
	 * 
	 * @return
	 * 		A instancia do gerenciador de servicos.
	 */
	public abstract Manager newManager();
	
	/**
	 * Retorna uma instancia do objeto {@link FileServer}.
	 * 
	 * @return
	 * 		A instancia do servidor de arquivos.
	 */
	public abstract FileServer newFileServer();
	
	/**
	 * Retorna uma instancia do objeto {@link ThreadPool}.
	 * 
	 * @return
	 * 		A instancia do pool de threads.
	 */
	public abstract ThreadPool newThreadPool();
	
	/**
	 * Retorna uma instancia do objeto {@link Logger}.
	 * 
	 * @return
	 * 		A instancia do registragor de logs.
	 */
	public abstract Logger newLogger();
	
	/**
	 * Retorna uma instancia do objeto {@link Configurator}.
	 * 
	 * @return
	 * 		A instancia do configurador de propriedades.
	 */
	public abstract Configurator newConfigurator();
	

	/**
	 * Retorna uma instancia do objeto {@link Daemon} do RMID.
	 * 
	 * @return
	 * 		A instancia do daemon do rmid.
	 */
	public abstract Daemon newRMIDDaemon();
	
}